#include "EItemMeta.h"
#include "EItemMetaFunction.h"
#include "EItemTest.h"
#include "EVariant.h"
#include <iostream>
#include <vector>
#include <string>
#include <DefineCommon.h>
#include <EItem.h>
#include <EItemVisitor.h>


extern EItemMetaFunctionPtr EItemTestAutogen_getFactoryFun();

int main_test_EItemTest(int argc, const char *argv[])//_test_EItemTest
{
    ELOG_INFO("ExeCommon test EItemTest");

    EItemTestPtr test1 = NewSmartPtr(EItemTest)();
    EItemMetaPtr meta1 = test1->getOrCreatMeta();

    ELOG_INFO("meta1:\n %s", meta1->getPrintStr().data());

    EVariant vReturn;
    EVariant v1(1.0);
    EVariant v2(1.0);
    EList<EVariant*> vList;
    vList.push_back(&v1);
    vList.push_back(&v2);
    meta1->getFunction("testAdd")->call(
            &vReturn, 
            &v1,
            &v2
            );
    meta1->getFunction("testAdd")->call(
            &vReturn,
            vList
            );

    /**test factory function fr EItemTest class*/
    EItemMetaFunctionPtr funConstruct = EItemTestAutogen_getFactoryFun();
    funConstruct->call(&vReturn);
    EItemTest* tempPtr = (EItemTest*)vReturn.value_ptr;
    EItemTestPtr test2(tempPtr);
    ELOG_INFO("meta2:\n %s", test2->getOrCreatMeta()->getPrintStr().data());

    /**test OnSetProperty/OnGetProperty */
    meta1->getProperty("testDouble")->setPropertyValue(EVariant(13.993));
    EVariant tempValue;
    meta1->getProperty("testDouble")->getPropertyValue(tempValue);
    ELOG_DEBUG("tempValue=%f", tempValue.value_double);


    return 1;
}
